home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 076-100 / disk_084 / gravitywars / grav.mod < prev    next >
Text File  |  1992-05-06  |  18KB  |  572 lines

  1. MODULE GravityWars;
  2. (*+,+*)
  3.  
  4. (**********************************************************************
  5. ***************           Written by Ed Bartz           ***************
  6. ***************           Copyright  5/14/87            ***************
  7. ***************    This program may be redistributed    ***************
  8. ***************    or modified as long as these         ***************
  9. ***************    notices and all other references     ***************
  10. ***************    to the author remain intack.         ***************
  11. ***************    Also this may not be used for        ***************
  12. ***************    profit by anyone without the         ***************
  13. ***************    express permission of the author.    ***************
  14. **********************************************************************)
  15.  
  16. (* FROM Title IMPORT Showpic; Title screen not included due to copyright
  17.       problems .*)
  18. FROM Libraries IMPORT CloseLibrary;
  19. FROM Intuition  IMPORT
  20.      IntuitionName, IntuitionBase, WindowPtr, ScreenPtr, Menu, Window,
  21.      ItemFlagSet, ItemEnabled, MenuToggle, MenuItem, ItemText;
  22. FROM Menus IMPORT SetMenuStrip, HighComp;
  23. FROM GraphicsLibrary IMPORT GraphicsName, GraphicsBase;
  24. FROM Windows IMPORT OpenWindow, CloseWindow;
  25. FROM Screens IMPORT NewScreen, OpenScreen, CloseScreen, ShowTitle;
  26. FROM RandomNumbers IMPORT Random;
  27. FROM MathLib0 IMPORT real,entier,sin,cos,ln,exp;
  28. FROM GW IMPORT 
  29.      Pl, Mdata, Shell, String, DrawPlanet, Distance, Pposition,
  30.      Sposition, Stars, Sexplosion, Pexplosion, DrawLine,
  31.      DrawShip;
  32. FROM MyWindow IMPORT
  33.      OpenLibraries, InitScreen, InitWindow, OpenIOWin, CloseIOWin,
  34.      InitMenu, SetColors, ReadMenu, MenuData, ReadMouse;
  35. FROM Rasters IMPORT SetRast;
  36. FROM Console IMPORT  
  37.      OpenWConsole, CloseWConsole, PutChar, PutStr, GetChar, GetStr,
  38.      QueueRead,  Conport, OpenRConsole, CloseRConsole, MayGetChar;
  39. FROM M2Conversions IMPORT 
  40.      ConvertCardinal, ConvertReal, ConvertToReal, ConvertToCardinal;
  41. FROM Pens IMPORT SetAPen, WritePixel, ReadPixel;
  42. FROM Options IMPORT
  43.      DeletePlanet, MakePlanet, ChangePlanet, MovePlanet, CleanScreen,
  44.      MoveShip,  IdentifyS;
  45. FROM InOut IMPORT WriteInt,WriteCard;
  46.  
  47. VAR
  48.      wp         : WindowPtr;
  49.      IOwp       : WindowPtr;
  50.      sp         : ScreenPtr;
  51.      Wport,Rport : Conport;
  52.      GravityWarsmenu  : MenuData;
  53.      ptype,Pnum,MaxPlan : CARDINAL;
  54.      erase      : BOOLEAN;
  55.  
  56.   PROCEDURE Game ();
  57.     CONST
  58.       round = 0.83;
  59.  
  60.     VAR
  61.       playernum,color,index  : CARDINAL;
  62.       PlanetPos : ARRAY [0..15] OF Pl;
  63.       Ship : ARRAY [0..1] OF Pl;
  64.       p,player : INTEGER;
  65.       temp,Set,GameOn,Quit : BOOLEAN;
  66.       Outmsg,Inmsg : String;
  67.       LastShot : Mdata;
  68.       Missle : Shell;
  69.       c,char : CHAR;
  70.  
  71.     PROCEDURE Setup;
  72.       BEGIN
  73.         SetRast(wp^.RPort,0);
  74.         Set:=TRUE;
  75.         Pnum:= Random(MaxPlan- 4)+4;
  76.         Stars(wp);
  77.         Pposition(PlanetPos,Pnum,ptype,wp);
  78.         Sposition(wp,Ship,PlanetPos,Pnum);
  79.       END Setup;
  80.   (*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++*)
  81.     PROCEDURE Maximum;
  82.  
  83.       VAR
  84.         results1,results : BOOLEAN;
  85.         str : ARRAY [0..80] OF CHAR;
  86.  
  87.       BEGIN
  88.         results:=OpenIOWin(Wport,IOwp,sp);
  89.         IF results THEN
  90.           PutStr(Wport,"Input maximum number of planets (5 to 15) ");
  91.           results:= GetStr(Rport,Wport,str);
  92.           IF results THEN
  93.             ConvertToCardinal(str,results,MaxPlan);
  94.             IF NOT(results) THEN MaxPlan:=9; END;
  95.           ELSE MaxPlan:=9;
  96.           END;
  97.           IF MaxPlan>15 THEN MaxPlan:= 15; END;
  98.           IF MaxPlan<5 THEN MaxPlan:= 5; END;
  99.           ConvertCardinal(MaxPlan,2,str);
  100.           WITH GravityWarsmenu DO
  101.             Text[13][18]:=str[0];
  102.             Text[13][19]:=str[1];
  103.           END;
  104.           CloseIOWin(Wport,IOwp);
  105.         END;
  106.    END Maximum;
  107.   (*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++*)
  108.     PROCEDURE ChooseSide;
  109.  
  110.       VAR
  111.         results1,results : BOOLEAN;
  112.         str : ARRAY [0..80] OF CHAR;
  113.  
  114.       BEGIN
  115.         results:=OpenIOWin(Wport,IOwp,sp);
  116.         IF results THEN
  117.           PutStr(Wport,"Choose which ship to practice with (1 or 2):");
  118.           results:= GetStr(Rport,Wport,str);
  119.           IF results THEN
  120.             ConvertToCardinal(str,results,playernum);
  121.             IF playernum > 2 THEN playernum := 0; END;
  122.           ELSE playernum := 0;
  123.           END;
  124.           CloseIOWin(Wport,IOwp);
  125.         END;
  126.    END ChooseSide;
  127.   (*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++*)
  128.     PROCEDURE READMenu;
  129.  
  130.       VAR
  131.         p,c : CARDINAL;
  132.  
  133.       BEGIN
  134.          c:=0;
  135.          c:=ReadMenu(wp);
  136.              CASE c OF
  137.             1: (* Setup Game *)
  138.                 Setup;                               |
  139.             2: (* Play Game *)
  140.                 IF Set THEN
  141.                   GameOn := TRUE;
  142.                   FOR p := 18 TO 22 DO
  143.                     WITH GravityWarsmenu.Items[p] DO
  144.                       Flags:=Flags-ItemFlagSet{ItemEnabled};
  145.                     END;
  146.                   END;
  147.                   WITH GravityWarsmenu.Items[9] DO
  148.                     Flags:=Flags-ItemFlagSet{ItemEnabled};
  149.                   END;
  150.                 END;                                 |
  151.             3: (* Stop Game *)
  152.                 GameOn:=FALSE;
  153.                 FOR p:=18 TO 22 DO
  154.                   WITH GravityWarsmenu.Items[p] DO
  155.                     Flags:=ItemFlagSet{ItemText, ItemEnabled} + HighComp;
  156.                   END;
  157.                 END;
  158.                 WITH GravityWarsmenu.Items[9] DO
  159.                   Flags:=ItemFlagSet{ItemText, ItemEnabled} + HighComp;
  160.                 END;                                 |
  161.             4: (* QUIT *)
  162.                 Quit:=TRUE;                          |
  163.             5: (* Set Maximum Planets *)
  164.                 Maximum;                             |
  165.             6:(* erase trails *)
  166.                 IF erase THEN 
  167.                 erase:= FALSE;
  168.                 GravityWarsmenu.Text[14]:="Erase Missle Trails";
  169.                 ELSE erase := TRUE;
  170.                 GravityWarsmenu.Text[14]:="Leave Missle Trails";
  171.                 END;                                 |
  172.             7:(* Redraw screen *)
  173.                 CleanScreen(wp,Ship,PlanetPos,Pnum,ptype); |
  174.             8:(* Change Planet Type *)
  175.                 IF ptype = 1 THEN
  176.                   GravityWarsmenu.Text[16]:="Fancy Planets";
  177.                   ptype := 0;
  178.                 ELSE
  179.                   GravityWarsmenu.Text[16]:="Plain Planets";
  180.                   ptype := 1;
  181.                 END;                                  |
  182.             9:(* One Player/Two Player *)
  183.                 IF playernum = 0 THEN
  184.                   ChooseSide;
  185.                 ELSE playernum := 0;
  186.                 END;   
  187.                 IF playernum = 0 THEN
  188.                     GravityWarsmenu.Text[17]:="Practice";
  189.                 ELSE  GravityWarsmenu.Text[17]:="Compete";
  190.                 END;                                     |
  191.             10: (* MoveShip *)
  192.                 Set:=TRUE;
  193.                 IF NOT(GameOn) THEN
  194.                   MoveShip(wp,Ship,PlanetPos,Pnum);
  195.                 END;                                 |   
  196.             11: (* MovePlanet *)
  197.                 Set:=TRUE;
  198.                 IF NOT(GameOn) THEN
  199.                   MovePlanet(wp,Ship,PlanetPos,Pnum,ptype);
  200.                 END;                                 |   
  201.             12: (*ChangePlanet*)
  202.                 Set:=TRUE;
  203.                 IF NOT(GameOn) THEN
  204.                   ChangePlanet(wp,PlanetPos,Pnum,ptype);
  205.                 END;                                 |   
  206.             13: (*MakePlanet*)
  207.                 Set:=TRUE;
  208.                 IF NOT(GameOn) THEN
  209.                   MakePlanet(wp,Ship,PlanetPos,Pnum,ptype);
  210.                 END;                                 |   
  211.             14: (*DeletePlanet*)
  212.                 Set:=TRUE;
  213.                 IF NOT(GameOn) THEN
  214.                   DeletePlanet(wp,PlanetPos,Pnum);
  215.                 END;
  216.              ELSE;
  217.              END;
  218.     END READMenu;
  219.   (*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++*)
  220.     PROCEDURE Play;
  221.  
  222.       VAR
  223.         ang,vel : REAL;
  224.         p : INTEGER;
  225.  
  226.       BEGIN
  227.         temp := MayGetChar(Rport,c);
  228.         player := 1;
  229.         WITH LastShot DO
  230.           P1ang:=0.0;
  231.           P1vel:=0.0;
  232.           P2ang:=0.0;
  233.           P2vel:=0.0;
  234.         END;
  235.         WHILE GameOn AND NOT(Quit) DO
  236.           IF player=0 THEN
  237.             player:= 1;
  238.             ang:=LastShot.P2ang;
  239.             vel:=LastShot.P2vel;
  240.           ELSE
  241.             player:=0;
  242.             ang:=LastShot.P1ang;
  243.             vel:=LastShot.P1vel;
  244.           END;
  245.           IF playernum > 0 THEN 
  246.             player := playernum -1;
  247.             IF player=1 THEN
  248.               ang:=LastShot.P2ang;
  249.               vel:=LastShot.P2vel;
  250.             ELSE
  251.               ang:=LastShot.P1ang;
  252.               vel:=LastShot.P1vel;
  253.           END;
  254.           END;
  255.           GetData(ang,vel,player);
  256.           IF vel>10.0 THEN vel:=10.0; END;
  257.           IF vel<(-10.0) THEN vel:=(-10.0); END;
  258.           IF player=1 THEN
  259.             LastShot.P2ang:=ang;
  260.             LastShot.P2vel:=vel;
  261.           ELSE
  262.             LastShot.P1ang:=ang;
  263.             LastShot.P1vel:=vel;
  264.           END;
  265.           WITH Missle DO
  266.             vx:=vel*cos((-ang)*0.0174533);
  267.             vy:=vel*sin(0.0174533*(-ang));
  268.             x:=Ship[player].x;
  269.             y:=Ship[player].y;
  270.           END;
  271.           READMenu;
  272.           Launch(Missle);
  273.           READMenu;
  274.         END;
  275.     END Play;
  276.   (*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++*)
  277.     PROCEDURE Gravity(VAR mis:Shell);
  278.  
  279.       VAR
  280.         dr3,dr,dx,dy,ax,ay : REAL;
  281.         p,j,k : INTEGER;
  282.  
  283.       BEGIN
  284.  
  285. (* This is here to work around a bug in the console device. If the read
  286.   device isn't read immediately it goes crazy. If you can fix it let me know
  287.   were I went wrong. *)
  288.         temp := MayGetChar(Rport,char);
  289.  
  290.         ax := 0.0;
  291.         ay := 0.0;
  292.         FOR p:= 0 TO Pnum-1 DO
  293.           WITH PlanetPos[p] DO
  294.             dx:=real(x-mis.x);
  295.             dy:=real(y-mis.y);
  296.             IF (ABS(dx)>5.0) OR (ABS(dy)>5.0) THEN
  297.               dr:=1.5*ln(dx*dx+dy*dy);
  298.               dr3:=exp(dr);
  299.               ax:=ax+(m*dx)/dr3;
  300.               ay:=ay+(m*dy)/dr3;
  301.             END;
  302.           END;
  303.         END;
  304.         WITH mis DO
  305.           vx:=ax+vx;
  306.           vy:=ay+vy;
  307.           x:=entier(vx)+x;
  308.           y:=entier(vy)+y;
  309.         END;
  310.     END Gravity;
  311.   (*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++*)
  312.     PROCEDURE Launch(VAR Mis:Shell);
  313.       VAR
  314.        c,i,j,n : CARDINAL;
  315.        Outside : BOOLEAN;
  316.        oldx,oldy,x1,y1,x2,y2,k,l : INTEGER;
  317.        eMis : Shell;
  318.  
  319.       BEGIN
  320.         eMis:= Mis;
  321.         Gravity (Mis);
  322.         i:=ReadPixel(wp^.RPort,Mis.x,Mis.y);
  323.         i:=3;
  324.         Outside:=FALSE;
  325.         REPEAT
  326.           Gravity (Mis);
  327.           IF (((Mis.x-eMis.x)>18)OR((Mis.x-eMis.x)<(-18))) THEN 
  328.             Outside:=TRUE;
  329.           END;
  330.           IF (((Mis.y-eMis.y)>7)OR((Mis.y-eMis.y)<(-7))) THEN 
  331.             Outside:=TRUE;
  332.           END;
  333.         UNTIL Outside;
  334.         i:=0;
  335.         Outside:=FALSE;
  336.         oldx:=Mis.x;
  337.         oldy:=Mis.y;
  338.         WITH Mis DO
  339.           REPEAT 
  340.             READMenu;
  341.             SetAPen(wp^.RPort,1);
  342.             Gravity(Mis);
  343.             IF (x>0)AND(x<639)AND(y>0)AND(y<398)THEN
  344.               x1:= (x - oldx);
  345.               y1:= (y - oldy);
  346.               IF ABS(x1)>ABS(y1) THEN k:=ABS(2*x1);
  347.               ELSE k:=ABS(2*y1);
  348.               END;
  349.               FOR l:=1 TO k DO
  350.                 x:= ((x1*l) DIV k)+oldx;
  351.                 y:= ((y1*l) DIV k)+oldy;
  352.                 n:=ReadPixel(wp^.RPort,x,y);
  353.                 IF n<3 THEN
  354.                   WritePixel(wp^.RPort,x,y);
  355.                 ELSE 
  356.                   i:=n;
  357.                   x2:=x;
  358.                   y2:=y;
  359.                 END;
  360.               END;
  361.             END;
  362.            IF i>2 THEN 
  363.              x:=x2;
  364.              y:=y2;
  365.            END;
  366.            IF (x<1)THEN oldx:=1; ELSIF (x>638)THEN oldx:=638; ELSE oldx:=x; END;
  367.            IF (y<1)THEN oldy:=1; ELSIF (y>398)THEN oldy:=398; ELSE oldy:=y; END;
  368.             IF (x<(-320))OR(x>940)OR(y<(-200))OR(y>600)THEN
  369.               Outside:=TRUE;
  370.             END;
  371.           UNTIL (Outside OR (i>2) OR NOT(GameOn) OR Quit);
  372.         END;
  373.         IF Outside THEN
  374.           PutString("Missle Left The Galaxy");
  375.         END;
  376.         IF i>3 THEN
  377.           Pexplosion(Mis,wp);
  378.         END;
  379.         IF i=3 THEN
  380.           j:= IdentifyS(Mis.x,Mis.y,Ship);
  381.           IF j<2 THEN 
  382.             Sexplosion(Mis,wp);
  383.             IF j=0 THEN
  384.               PutString("Player 2 Wins!!!");
  385.             ELSE
  386.               PutString("Player 1 Wins!!!");
  387.             END;
  388.             FOR j:=18 TO 22 DO
  389.               WITH GravityWarsmenu.Items[j] DO
  390.                 Flags:=ItemFlagSet{ItemText, ItemEnabled} + HighComp;
  391.               END;
  392.             END;
  393.             WITH GravityWarsmenu.Items[9] DO
  394.               Flags:=ItemFlagSet{ItemText, ItemEnabled} + HighComp;
  395.             END;
  396.             Set:=FALSE;
  397.             GameOn:=FALSE;
  398.           ELSE i:=0;
  399.           END;
  400.         END;
  401.         IF erase AND NOT(i=3) THEN
  402.           Mis:= eMis;
  403.           Gravity (Mis);
  404.           i:=ReadPixel(wp^.RPort,Mis.x,Mis.y);
  405.           i:=3;
  406.           Outside:=FALSE;
  407.           REPEAT
  408.             Gravity (Mis);
  409.             IF (((Mis.x-eMis.x)>18)OR((Mis.x-eMis.x)<(-18))) THEN 
  410.               Outside:=TRUE;
  411.             END;
  412.             IF (((Mis.y-eMis.y)>7)OR((Mis.y-eMis.y)<(-7))) THEN 
  413.               Outside:=TRUE;
  414.             END;
  415.           UNTIL Outside;
  416.           i:=0;
  417.           Outside:=FALSE;
  418.           oldx:=Mis.x;
  419.           oldy:=Mis.y;
  420.           WITH Mis DO
  421.             REPEAT 
  422.               READMenu;
  423.               SetAPen(wp^.RPort,0);
  424.               Gravity(Mis);
  425.               IF (x>0)AND(x<639)AND(y>0)AND(y<398)THEN
  426.                 x1:= (x - oldx);
  427.                 y1:= (y - oldy);
  428.                 IF ABS(x1)>ABS(y1) THEN k:=ABS(2*x1);
  429.                 ELSE k:=ABS(2*y1);
  430.                 END;
  431.                 FOR l:=1 TO k DO
  432.                   x:= ((x1*l) DIV k)+oldx;
  433.                   y:= ((y1*l) DIV k)+oldy;
  434.                   n:=ReadPixel(wp^.RPort,x,y);
  435.                   IF n<3 THEN
  436.                     WritePixel(wp^.RPort,x,y);
  437.                   ELSE 
  438.                     i:=n;
  439.                     x2:=x;
  440.                     y2:=y;
  441.                   END;
  442.                 END;
  443.               END;
  444.               IF i>2 THEN 
  445.                 x:=x2;
  446.                 y:=y2;
  447.               END;
  448.            IF (x<1)THEN oldx:=1; ELSIF (x>638)THEN oldx:=638; ELSE oldx:=x; END;
  449.            IF (y<1)THEN oldy:=1; ELSIF (y>398)THEN oldy:=398; ELSE oldy:=y; END;
  450.               IF (x<(-320))OR(x>940)OR(y<(-200))OR(y>600)THEN
  451.                 Outside:=TRUE;
  452.               END;
  453.             UNTIL (Outside OR (i>2) OR NOT(GameOn) OR Quit);
  454.           END;
  455.         END;
  456.     END Launch;
  457.   (*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++*)
  458.     PROCEDURE PutString(msg:String);
  459.       
  460.       VAR
  461.        p : LONGCARD;
  462.        results,results1 : BOOLEAN;
  463.  
  464.       BEGIN
  465.         results:= OpenIOWin(Wport,IOwp,sp);
  466.         IF results THEN 
  467.           PutStr(Wport,msg);
  468.           FOR p := 0 TO 150000 DO;
  469.           END;
  470.         END;
  471.         CloseIOWin(Wport,IOwp);
  472.     END PutString;
  473.   (*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++*)
  474.    PROCEDURE Newline;
  475.      BEGIN
  476.        PutChar(Wport,12C);
  477.        PutChar(Wport,15C);
  478.      END Newline;
  479.   (*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++*)
  480.     PROCEDURE GetData(VAR ang,vel:REAL;player:INTEGER);
  481.  
  482.       VAR
  483.         results,results1 : BOOLEAN;
  484.         p : CARDINAL;
  485.         String : ARRAY [0..80] OF CHAR;
  486.         c : CHAR;
  487.  
  488.       BEGIN
  489.         results:=OpenIOWin(Wport,IOwp,sp);
  490.         IF results THEN
  491.           IF player=0 THEN PutStr(Wport,"Player 1");
  492.             ELSE PutStr(Wport,"Player 2");
  493.           END;
  494.           Newline;
  495.           PutStr(Wport,"Input Firing angle [");
  496.           ConvertReal(ang,9,6,String);
  497.           PutStr(Wport,String);
  498.           PutStr(Wport,"]: ");
  499.           results:= GetStr(Rport,Wport,String);
  500.           IF results THEN
  501.             ConvertToReal(String,results,ang);
  502.             IF NOT(results) THEN ang:=0.0; END;
  503.           END;
  504.           Newline;
  505.           PutStr(Wport,"Input Firing Velocity [");
  506.           ConvertReal(vel,9,6,String);
  507.           PutStr(Wport,String);
  508.           PutStr(Wport,"]: ");
  509.           results:= GetStr(Rport,Wport,String);
  510.           IF results THEN
  511.             ConvertToReal(String,results,vel);
  512.             IF NOT(results) THEN vel:=1.0; END;
  513.           END;
  514.         END;
  515.         CloseIOWin(Wport,IOwp);
  516.   END GetData;
  517.   (*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++*)
  518.     BEGIN
  519.       ShowTitle (sp,FALSE);
  520.       Set := FALSE;
  521.       Quit:=FALSE;
  522.       GameOn:=FALSE;
  523.       ptype := 1;
  524.       playernum := 0;
  525.       erase := FALSE;
  526.  
  527.       LOOP (***** Main GravityWars loop *****)
  528.         temp := MayGetChar(Rport,c);
  529.         p:=Random(700);(*Randomize*)
  530.         READMenu;
  531.           IF GameOn THEN
  532.             Play;
  533.           END;
  534.           IF Quit THEN
  535.             EXIT;
  536.            END;
  537.       END; (* LOOP *)
  538.   END Game;
  539. (*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++*)
  540.  
  541.   BEGIN
  542.     (* This is here because, NIL <> ADDRESS (0) *)
  543.     (* Open assorted libraries *)
  544.      MaxPlan:= 9;
  545.      Pnum := 0;
  546. (* Normally the title screen routine would be called here. However since
  547. most of that routine was the showilbm.mod program I removed it from the 
  548. source rather than worry about copyright problems.
  549.         Showpic('title');    *)
  550.      IF  OpenLibraries () THEN
  551.         (* Intialize everything else *)
  552.         sp := InitScreen ();
  553.         wp := InitWindow (sp);
  554.         InitMenu (GravityWarsmenu);
  555.         (* Attach the menu to the window *)
  556.         SetMenuStrip (wp, GravityWarsmenu.menu[0]);
  557.         (* Set up colors *)
  558.         SetColors (sp);
  559.         (* Lets Play*)
  560.         erase := OpenRConsole(Rport,wp);        
  561.         IF erase THEN
  562.           Game ();
  563.         END;
  564.         (* Close windows etc...*)
  565.         CloseRConsole(Rport);
  566.         CloseWindow (wp);
  567.         CloseScreen (sp);
  568.         CloseLibrary (IntuitionBase);
  569.         CloseLibrary (GraphicsBase)
  570.       END
  571.  END GravityWars.
  572.